package Servicios;

import DAO.UsuarioDAO;
import Entidad.Usuario;
import VO.UsuarioVO;
import java.util.Arrays;
import javax.persistence.EntityManager;

public class ServicioUsuario {

    /**
     * <p>Método que valida el inicio de sesión de un usuario.</p>
     *
     * @param correo
     * @param contraseña
     *
     * @return Resultado del login
     */
    public boolean iniciarSesion (String correo, char[] contraseña,EntityManager em){
        UsuarioDAO dao = new UsuarioDAO();
        Usuario u = dao.encontrarUsuarioPorCorreo(correo,em);
        if (u!=null){
            if (Arrays.equals(contraseña, u.getContrasena())){
                return true;
            }else{
                return false;
            }
        }
        return false;
    }

    /**
     * <p>Busca y devuelve el usuario que tenga el correo pasado como argumento</p>
     * @param correo String con el correo del usuario que se desea encontrar
     * @param em EntityManager que se conecta con la base de datos
     * @return un usuario con ese correo o null si no existe
     */
    public UsuarioVO getUsuario(String correo,EntityManager em){
        Usuario usuario=new UsuarioDAO().encontrarUsuarioPorCorreo(correo,em);
        if(usuario==null)
            return null;
        return usuario_a_VO(usuario);
    }

    /**
     * <p>Actualiza la informacion del usuario pasado como argumento en la base de datos</p>
     * @param usuarioVO UsuarioVO con la informacion de usuario que se desea editar
     * @param em EntityManager que se conecta con la base de datos
     * @return true si la actualizacion fue exitosa, false de otro modo
     */
    public void editarUsuario(UsuarioVO usuarioVO,EntityManager em){
        UsuarioDAO dao=new UsuarioDAO();
        dao.actualizar(VO_a_Usuario(usuarioVO),em);
    }

    /**
     * <p>Registra un nuevo usuario en la base de datos</p>
     * @param usuarioVO UsuarioVO con la informacion del usuario que se desea registrar
     * @param em EntityManager que se conecta con la base de datos
     * @return true si se registro correctamente, false si no
     */
    public void registrarUsuario(UsuarioVO usuarioVO,EntityManager em){
        UsuarioDAO dao=new UsuarioDAO();
        dao.crear(VO_a_Usuario(usuarioVO),em);
    }

    /**
     * <p>Verifica si un usuario existe en la base de datos</p>
     * @param usuarioVO UsuarioVO con la informacion del posible nuevo usuario
     * @param em EntityManager que se conecta con la base de datos
     * @return true si ya existe un usuario con la cedula, el codigo o el correo del usuario pasado como argumento, false si no
     */
    public boolean usuarioYaRegistrado(UsuarioVO usuarioVO,EntityManager em){
        UsuarioDAO dao=new UsuarioDAO();
        Usuario u=dao.encontrarUsuario(usuarioVO.getCorreo(),usuarioVO.getCedula(),usuarioVO.getCodigo(),em);
        return u!=null;
    }

    /**
     * <p>Toma un usuario y devuelve su version VO</p>
     * @param usuario Usuario
     * @return usuarioVO con la misma informacion del argumento
     */
    private UsuarioVO usuario_a_VO(Usuario usuario){
        UsuarioVO usuarioVO=new UsuarioVO();
        usuarioVO.setCedula(usuario.getCedula());
        usuarioVO.setCodigo(usuario.getCodigo());
        usuarioVO.setContrasena(usuario.getContrasena());
        usuarioVO.setCorreo(usuario.getCorreo());
        usuarioVO.setFallas(usuario.getFallas());
        usuarioVO.setNombre(usuario.getNombre());
        return usuarioVO;
    }

    /**
     * <p>Toma un usuarioVO y devuelve su version usuario</p>
     * @param usuarioVO UsuarioVO
     * @return usuario con la misma informacion del argumento
     */
    private Usuario VO_a_Usuario(UsuarioVO usuarioVO){
        Usuario usuario=new Usuario();
        usuario.setCedula(usuarioVO.getCedula());
        usuario.setCodigo(usuarioVO.getCodigo());
        usuario.setContrasena(usuarioVO.getContrasena());
        usuario.setCorreo(usuarioVO.getCorreo());
        usuario.setFallas(usuarioVO.getFallas());
        usuario.setNombre(usuarioVO.getNombre());
        return usuario;
    }

}